package com.kexilo.system.audit.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kexilo.core.audit.domain.SysDataArchive;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 数据归档映射层
 *
 * @author Kexilo
 */
@Mapper
public interface SysDataArchiveMapper extends BaseMapper<SysDataArchive> {

    /**
     * 查询归档记录列表
     *
     * @param archive 归档记录
     * @return 归档记录列表
     */
    List<SysDataArchive> selectArchiveList(SysDataArchive archive);

    /**
     * 根据表名查询最近的归档记录
     *
     * @param tableName 表名
     * @return 归档记录
     */
    SysDataArchive selectLatestByTableName(@Param("tableName") String tableName);

    /**
     * 查询正在进行的归档任务
     *
     * @return 归档记录列表
     */
    List<SysDataArchive> selectRunningTasks();

    /**
     * 更新归档任务状态
     *
     * @param archiveId 归档ID
     * @param status 状态
     * @param endTime 结束时间
     * @param archiveCount 归档数量
     * @param deleteCount 删除数量
     * @param errorMessage 错误信息
     * @return 影响行数
     */
    int updateArchiveResult(@Param("archiveId") Long archiveId,
                           @Param("status") String status,
                           @Param("endTime") LocalDateTime endTime,
                           @Param("archiveCount") Long archiveCount,
                           @Param("deleteCount") Long deleteCount,
                           @Param("errorMessage") String errorMessage);

    /**
     * 清理过期的归档记录
     *
     * @param beforeTime 保留时间点
     * @return 清理数量
     */
    int deleteArchiveRecordsBefore(@Param("beforeTime") LocalDateTime beforeTime);

    /**
     * 查询归档统计信息
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    Map<String, Object> selectArchiveStatistics(@Param("startDate") LocalDateTime startDate,
                                               @Param("endDate") LocalDateTime endDate);

    /**
     * 按表名统计归档数量
     *
     * @param days 天数
     * @return 统计结果
     */
    List<Map<String, Object>> selectArchiveCountByTable(@Param("days") int days);
}
